package com.huashi.dealer.modular.business.balance.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.huashi.dealer.commonEntity.UserBalanceApply;
import com.huashi.dealer.commonEntity.UserBalanceLog;
import com.huashi.dealer.modular.business.balance.bo.BalanceBo;
import com.huashi.dealer.modular.business.balance.param.*;
import com.huashi.dealer.modular.business.balance.vo.BalanceVo;
import com.huashi.dealer.modular.business.balance.vo.BalanceApplyListVo;
import com.huashi.dealer.modular.business.balance.vo.RechargeReviewListVo;

import java.math.BigDecimal;

/**
 * API打款单Service接口
 *
 * @author 谭陈强
 * @since 2025-07-30
 */
public interface BalanceService extends IService<UserBalanceLog> {

    /**
     * 申请打款单
     *
     * @param money 金额
     * @param images 图片文件
     */
    void applyBalance(String money, String images);

    /**
     * 获取余额日志列表
     *
     * @return 余额日志列表
     */
    Page<UserBalanceLog> getBalanceLogList(Page<UserBalanceLog> page, Integer time);

    /**
     * 获取余额详情
     *
     * @param token 用户令牌
     * @return 余额详情
     */
    BalanceResponseParam getBalanceDetail(String token);

    /**
     * 提现申请
     *
     * @param requestParam 请求参数
     */
    void withdrawBalance(BalanceRequestParam requestParam);

    /**
     * 获取打款单列表
     *
     * @param token 用户令牌
     * @param page 页码
     * @param listRows 每页数量
     * @return 打款单列表
     */
    BalanceResponseParam getBalanceApplyList(String token, Integer page, Integer listRows);

    /**
     * 获取打款单详情
     *
     * @param applyId 申请ID
     * @param token 用户令牌
     * @return 打款单详情
     */
    BalanceResponseParam getBalanceApplyDetail(Long applyId, String token);

    /**
     * 取消打款单
     *
     * @param applyId 申请ID
     * @param token 用户令牌
     */
    void cancelBalanceApply(Long applyId, String token);

    /**
     * 余额充值
     *
     * @param requestParam 请求参数
     * @return 充值结果
     */
    BalanceResponseParam rechargeBalance(BalanceRequestParam requestParam);

    /**
     * 提交充值申请
     *
     * @param userId 用户ID
     * @param money 充值金额
     * @param images 凭证图片
     * @return 申请结果
     */
    UserBalanceApply submitBalanceApply(Long userId, BigDecimal money, String images);

    /**
     * 获取用户充值申请列表
     *
     * @param userId 用户ID
     * @param page 分页参数
     * @return 充值申请列表
     */
    Page<UserBalanceApply> getUserBalanceApplyList(Long userId, Page<UserBalanceApply> page);

    /**
     * 获取充值申请详情
     *
     * @param applyId 申请ID
     * @param userId 用户ID
     * @return 充值申请详情
     */
    UserBalanceApply getBalanceApplyDetailById(Long applyId, Long userId);

    /**
     * 审核充值申请
     *
     * @param applyId 申请ID
     * @param balanceStatus 审核状态
     * @param rejectReason 驳回原因
     * @param salesmanStoreUserId 审核业务员ID
     * @return 审核结果
     */
    boolean auditBalanceApply(Long applyId, Integer balanceStatus, String rejectReason, Long salesmanStoreUserId);

    Page<BalanceVo> getBalanceLogList(BalanceBo param, Page page);

    /**
     * 获取打款单列表（管理端-Store端）
     *
     * @param param 查询参数
     * @param page 分页参数
     * @return 打款单列表
     */
    Page<BalanceApplyListVo> getStoreBalanceApplyPage(BalanceApplyListParam param, Page<BalanceApplyListVo> page);

    /**
     * 审核打款单（管理端-Store端-初审）
     *
     * @param applyId 申请ID
     * @param balanceStatus 审核状态
     * @param rejectReason 驳回原因
     * @param salesmanStoreUserId 审核业务员ID
     */
    void storeAuditBalanceApply(Long applyId, Integer balanceStatus, String rejectReason, Long salesmanStoreUserId);

    /**
     * 复核打款单（管理端-Store端-终审）
     *
     * @param applyId 申请ID
     * @param balanceStatus 审核状态
     * @param rejectReason 驳回原因
     * @param salesmanStoreUserId 审核业务员ID
     */
    void storeReviewBalanceApply(Long applyId, Integer balanceStatus, String rejectReason, Long salesmanStoreUserId);

    /**
     * 充值审核列表
     */
    Page<RechargeReviewListVo> getRechargeReviewPage(
            RechargeReviewListParam param,
            Page<RechargeReviewListVo> page);

    /**
     * 充值初审
     */
    void rechargeInitialReview(RechargeReviewAuditParam param, Long storeUserId);

    /**
     * 充值复核
     */
    void rechargeCheckReview(RechargeReviewAuditParam param, Long storeUserId);
} 